
/* In der Klasse Dashboard werden ein JFrame und 
 * 2 JPanel erzeugt. Auf dem JFrame werden diese beiden 
 * JPanels platziert. Eines enthaelt die Navigation und ein 
 * anderes die Funktiontaet (z.B. Medium ausleihen).
 *  
 * 
 * Datei: Dashboard.java               Autor: Johannes Reinhard
 * Datum: 03.11.2011                   Version: 0.7 
 * 
 *
 */
package GUI;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import medienverwaltung.simulation.Simulation;
import basis.lokal.Sprachen;
import bibvis.FassadeBibVis;
import personenverwaltung.*;
import statistik.Statistik;
import suche.MitarbeiterFernster;
import bestellungsverwaltung.*;

public class Dashboard
{
  /* Hauptfenster */
  protected JFrame hauptJFrame;
  /* Container */
  private JPanel hauptJPanel;
  protected JPanel navigationsleiste;
  /* Buttons der Navigation */
  protected JButton buttonProfil;
  protected JButton buttonSuchmaske;
  protected JButton buttonPersonVerwalten;
  protected JButton buttonMediumVerwalten;
  protected JButton buttonMediumAusleihen;
  protected JButton buttonStandort;
  protected JButton buttonStatistik;
  protected JButton buttonBestellung;
  protected JButton buttonLogout;	
  protected JButton buttonFinanzen;
  protected JButton buttonInventar;
  protected JButton buttonAnschaffung;
  
  /* Hilfsvariable zur Ermittlung der Bildschirmgroesse */
  private Dimension bildschirmgroesse;
  
  /* Hier werden die Button der Navigation 
   * in einer ArrayList gespeichert */
  private ArrayList<JButton> buttonliste;
  
  /* Sprachspeicher */
  protected static WechselSprache sprache;
  
  /*Personenverwaltung */
  protected Personenverwaltung persVer;
  protected static int nutzerID = 0;
  
  /*Gesamtehoehe der Taskleiste in Pixel*/
  private final int gesamthoehe_leiste;    
  /*Teil Bildschirmehoehe in Pixel*/
  private final int b_hoehe;
  /* private final int b_breite; */
  /* Button hoehe */
  private final int button_h;
  
  /* Objekte werden zwischengespeichert damit sie bei bedarf 
   * weiter verwendet werden koennen*/
  protected Simulation simulationMedien;
  protected FassadeBibVis fassade;
  
  /* JFrames, damit sie bei dedarf geschlossen werden koennen. */
  protected JFrame frameStatistik;
  protected JFrame frameBibVis;
  protected JFrame frameAnschaffung;
  protected JFrame frameInventar;
  protected JFrame frameBestellung;
  protected JFrame frameFinanzen;
  protected JFrame frameProfil;
  protected JFrame framePerson;
  protected JFrame frameSuche;
  
  /**
   * Kostruktor der Klasse Dashboard
   */
  public Dashboard ()
  {
    /* Bildschirmaufloesung ermitteln */
    bildschirmgroesse = java.awt.Toolkit.getDefaultToolkit ()
	.getScreenSize ();
    /* MAximale Fesnterhoehe */
    Rectangle fenstergroesse = GraphicsEnvironment.
	getLocalGraphicsEnvironment().getMaximumWindowBounds();
    
    /* Ermittlung der Hoehe der Taskleiste in Pixel */
    gesamthoehe_leiste = (int) (bildschirmgroesse.height 
	- fenstergroesse.getY () - fenstergroesse.getHeight());
    
    b_hoehe = bildschirmgroesse.height / 10;
    /* b_breite = bildschirmgroesse.width / 10; */
    persVer = new Personenverwaltung ();
    /* berechnung der buttonhoehe */
    button_h = bildschirmgroesse.height / 13;
  }
  /**
   * Erzeugt Fenster und initalisiert wichtigte Funktionen
   */ 
  protected void fensterErzeugen ()
  {
    hauptJFrame = new JFrame ("Dashboard");		
    /* Massnahmen bei Schliessung */
    fensterSchliessen ();   	
    /* Auf Bildschrimgroesse anpassen und hoeh der Taskleiste
     * abziehen*/
    hauptJFrame.setSize (bildschirmgroesse.width, 
	bildschirmgroesse.height - gesamthoehe_leiste);
    /* kein Layout setzen */
    hauptJFrame.setLayout (null);
    /* Navigation auf JFrame positionieren */
    hauptJFrame.add(erzeugeNavigatiosnJPanel());
    navigationsleiste.setBounds (0, 0, 160, 10 * b_hoehe);
    /* Fuege das HauptJPanel zu JFrame hinzu */
    hauptJPanelHinzufuegen (erzeugeHauptJPanel ());
    /* Buttons mit sinnvollen Taetigkeit beauftragen */
    buttonInAktionBringen ();
    /* Mache JFrame sichtbar */
    hauptJFrame.setVisible (true);
    /* Verhindert das das Fenster Stanardmaessig geschlossen
     * wird wenn die "windowClosing" Operation ausgefuehrt wurde.  */
    hauptJFrame.setDefaultCloseOperation 
    (WindowConstants.DO_NOTHING_ON_CLOSE);
    /* Fenstergroesse nicht aenderbar */
    hauptJFrame.setResizable (false);
  }


  /**
   * Legt fest was passiert wenn Fenster geschlossen wird
   */ 
  private void fensterSchliessen ()
  {
    /* Was passiert wenn das Fenster geschlossen wird. */
    hauptJFrame.addWindowListener (new WindowAdapter() 
    {
      public void windowClosing (WindowEvent e) 
      {
	/* Ueberpruefen ob der Nutzer sich bereits abgemldet hat.
    	   Wenn der Benutzer sich falsch angemdelt hat. */
	int eingabe = JOptionPane.showConfirmDialog(null,
	    sprache.lokal.gibUebersetzung ("Beenden"), "Beenden", 
    		JOptionPane.YES_NO_OPTION);
    	if (eingabe == JOptionPane.YES_OPTION)
    	{
    	  /* Daten sichern damit sie nicht verloren gehen.  */
    	  persVer.datenSpeichern ();
    	  System.exit (2);
    	}
      }
    });
  }
  /**
   * Erzeugt Navigation und platziert diese auf einem JPanel und	 
   * gibt dieses zurueck.
   * @return JPanel
   */
  private JPanel erzeugeNavigatiosnJPanel ()
  {
    navigationsleiste = new JPanel ();
    buttonliste = new ArrayList<JButton> ();
  	
    buttonProfil = new JButton ("Profil");
    buttonSuchmaske = new JButton ("Suchen");
    buttonPersonVerwalten = new JButton ("Personen Verwalten"); 
    buttonMediumVerwalten = new JButton ("Medium Verwalten");
    buttonMediumAusleihen = new JButton ("Medium Ausleihen");
    buttonStandort = new JButton ("Standort");
    buttonStatistik = new JButton ("Statistik");
    buttonBestellung = new JButton ("Bestellung");
    buttonLogout = new JButton ("Logout");
    buttonFinanzen = new JButton ("Finanzen");
    buttonInventar = new JButton ("Inventar");
    buttonAnschaffung = new JButton ("Anschaffungsvorschlag");
  	
    navigationsleiste.setLayout (null);	
  	
    /* Buttons initalisieren und groesse festlegen
     * und an der richtigen Postition einfuegen.  */
    buttonliste.add (buttonProfil);                    /*0 */
    buttonliste.add (buttonSuchmaske);                 /*1 */
    buttonliste.add (buttonPersonVerwalten);           /*2 */
    buttonliste.add (buttonMediumVerwalten);           /*3 */
    buttonliste.add (buttonMediumAusleihen);           /*4 */
    buttonliste.add (buttonStandort);                  /*5 */
    buttonliste.add (buttonStatistik);                 /*6 */
    buttonliste.add (buttonBestellung);                /*7 */
    buttonliste.add (buttonFinanzen);                  /*8 */
    buttonliste.add (buttonInventar);		       /*9 */
    buttonliste.add (buttonAnschaffung);               /*10 */
    buttonliste.add (buttonLogout);                    /*11 */
    
    return navigationsleiste;	
  }
  
  /**
   * Wenn Button entferntwerden, 
   * dann wird die Navileiste neue gestaltet.
   * @param nichtVerwenden
   */
  protected void neuSortieren (int nichtVerwenden[])
  {
    int j = 0;                       /* Abstandsermittlung            */
    int n;                           /* Laufvariable der For-Schleife */

    navigationsleiste.removeAll ();

    for (n = 0; n < buttonliste.size (); n++)
    {
      if (nichtVerwenden [n] == 0)
      {
	buttonliste.get (n).setBounds (0, j, 160, button_h);
	navigationsleiste.add (buttonliste.get (n));
	j += button_h;
      }
    }
    navigationsleiste.repaint ();
  }
  
  /**
   * Start JPanel erzeugen und initalisieren und
   * dieses zurueckgeben.
   * @return JPanel
   */
  private JPanel erzeugeHauptJPanel()
  {
    AuthentifizierungsGUI authi = new AuthentifizierungsGUI 
	(gibDashboard ());
    hauptJPanel = authi.getHauptJPanel ();
    return hauptJPanel;
  }
  
  /**
   * Das hauptJPanel an der richtigen stelle einbinden.
   * @param panel
   */
  private void hauptJPanelHinzufuegen (JPanel panel)
  {	  	
    hauptJFrame.remove (hauptJPanel);
    hauptJPanel = panel;
    /* Fuege das HauptJPanel zum JFRame hinzu */
    hauptJFrame.add (hauptJPanel);
    /* Lege Groesse und Position des HauptJPanel fest.
     * Damit es an der Richtigen stelle Eingefuegt werden kann. */
    hauptJPanel.setBounds (160, 0, bildschirmgroesse.width,
	bildschirmgroesse.height);
  }
  
  /**
   * Buttons werden mit ActionListener versehen und es wird festgelegt
   * was passiert wenn sie bestaetigt werden.
   */
  private void buttonInAktionBringen ()
  {
    /* Button mit Aktion Listener versehen. */
    buttonMediumAusleihen.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    MediumAusleihenGUI ausleihen = new MediumAusleihenGUI (
		gibDashboard ());
  	    hauptJPanelHinzufuegen (ausleihen.getHauptJPanel ());
  	  }
  	}			
      );
  	
    /* Button mit Aktion Listener versehen. */
    buttonLogout.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    LogoutGUI logout = new LogoutGUI (gibDashboard ());
	    hauptJPanelHinzufuegen (logout.getHauptJPanel ());
  	  }
  	}			
      );
  	
    /* Button mit Aktion Listener versehen. */
    buttonStatistik.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    frameStatistik = new Statistik ();
  	  }
  	}			
      );
  	
      /* Button mit Aktion Listener versehen. */
    buttonSuchmaske.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    try
	    {
	      frameSuche = new MitarbeiterFernster ();
  	    }
  	    catch (Exception ex)
  	    {
  	      System.out.println ("Suche: " + ex);
  	      SuchmaskenGUI such = new SuchmaskenGUI (gibDashboard ());
  	      hauptJPanelHinzufuegen (such.gibHauptJPanel ());
  	    }
  	  }	
  	}
      );
  	
    /* Button mit Aktion Listener versehen. */
    buttonProfil.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    ProfilGUI profilGUI = new ProfilGUI (gibDashboard ());
	    frameProfil = profilGUI.gibProfil ();
  	  }
  	}			
      );
  	
    /* Button mit Aktion Listener versehen. */
    buttonMediumVerwalten.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    simulationMedien = new Simulation ();
  	  }
  	}			
      );
  	
    /* Button mit Aktion Listener versehen. */
    buttonStandort.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    fassade = new FassadeBibVis ();
	    frameBibVis = fassade.legeBibVisAn (
		WechselSprache.sprachen.toString ());
  	  }
  	}			
      );
  	
    /* Button mit Aktion Listener versehen. */
    buttonPersonVerwalten.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    PersonVerwaltenGUI personVerGUI = new 
		PersonVerwaltenGUI (gibDashboard ());
  	    framePerson = personVerGUI.gibPerson ();
  	  }
  	}			
      );
  	
    /* Button mit Aktion Listener versehen. */
    buttonAnschaffung.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    frameAnschaffung = new JFrame ();
	    Vorgangsverwaltung vorgang = new Vorgangsverwaltung ();
	    GUI_Anschaffungsvorschlag gui = new 
		GUI_Anschaffungsvorschlag (vorgang, 
		    persVer.gibBenutzer (nutzerID));
  	    frameAnschaffung.add (gui.gibPanel ());
  	    frameAnschaffung.pack ();
  	    frameAnschaffung.setVisible (true);
  	  }
  	}     
      );  
  	
    /* Button mit Aktion Listener versehen. */
    buttonInventar.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    try
	    {
	      frameInventar = new Inventar_gui ();
  	    }
	    catch (Exception ex)
	    {
	      System.out.print ("Inventar: " + ex);
  	    }
  	  }
  	}     
      ); 
  	
    /* Button mit Aktion Listener versehen. */
    buttonBestellung.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    try
	    {
	      frameBestellung = new Bestellung_gui ();
  	    }
	    catch (Exception ex)
	    {
	      System.out.print ("Bestellung: " + ex);
  	    }
  	  }
  	}     
      ); 
  	
    /* Button mit Aktion Listener versehen. */
    buttonFinanzen.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {
	    try
	    {
	      frameFinanzen = new Finanzen_gui ();
            }
	    catch (Exception ex)
	    {
	      System.out.print ("Finanzen: " + ex);
            }
  	  }
  	}   
      ); 
  }
  
  /**
   * Gibt das Gesamte Objekt der Klasse Dashboard zurueck.
   * @return Dashboard
   */
  protected Dashboard gibDashboard ()
  {
    return this;
  }
  
  /**
   * Gib Bildschirmgroesse
   * @return Dimension
   */
  protected Dimension gibBildschirmgroesse ()
  {
    return bildschirmgroesse;
  }
  

  /**
   * Gibt die Verwendete Sprache zurueck. Als Standardwert ist
   * Deutsch gesetzt.
   * @return
   */
  public static Sprachen verwendeteSprache()
  {
    return WechselSprache.sprachen;
  }
  
  public static int nutzerID ()
  {
    return nutzerID;
  }
  
  protected int gibGesamthoehe_leiste ()
  {
    return gesamthoehe_leiste;
  }
}
